package com.voodoo.lib_utils;

import android.graphics.Bitmap;
import android.text.TextUtils;
import android.util.Log;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigDecimal;

/**
 * Author：voodoo
 * CreateTime：2021/06/18 018 下午 04:17
 * Description：文件工具类
 */
public class FileUtils {

    /**
     * 判断文件夹是否存在
     *
     * @param folderPath 文件夹路径
     * @param isMkdir    是否创建
     * @return 存在或创建成功，返回true，如果不存在或需要创建并且创建失败，返回false
     */
    public static boolean checkFolderIsExists(String folderPath, boolean isMkdir) {
        File file = new File(folderPath);
        // 如果文件夹不存在则创建
        if (!file.exists() && !file.isDirectory()) {
            if (isMkdir) {
                return file.mkdirs(); // 联通父目录一并创建
//                return file.mkdir(); // 只创建文件或文件夹，父目录不存在会返回false
            }
            return false;
        } else {
            return true;
        }
    }
    /**
     * 将字符串写入文件
     *
     * @param filePath 文件
     * @param content  写入内容
     * @param isAppend 是否追加在文件末
     * @return {@code true}: 写入成功<br>{@code false}: 写入失败
     */
    public static boolean writeFileFromString(String filePath, String content, boolean isAppend) {
        if (filePath.isEmpty() || content.isEmpty()) {
            return false;
        }
        try {
            File file = new File(filePath);
            if (!file.exists()) {
                file.getParentFile().mkdirs(); // 创建文件目录
                file.createNewFile(); // 创建文件filename,只创建文件，不创建文件夹
            }
            FileWriter fileWriter = new FileWriter(file.getAbsoluteFile(), isAppend);
            BufferedWriter bw = new BufferedWriter(fileWriter);
            bw.write(content);
            bw.close();
            return true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }
    /**
     * 将字符串写入文件
     *
     * @param filePath 文件
     * @param content  写入内容
     * @param isAppend 是否追加在文件末
     * @return {@code true}: 写入成功<br>{@code false}: 写入失败
     */
    public static boolean writeFileFromString(String  filePath,String fileName, String content, boolean isAppend) {
        if (filePath.isEmpty() || content.isEmpty()) {
            return false;
        }
        try {
            File parentFile = new File(filePath);
            Log.e("tjf==", "文件地址--" + parentFile.getAbsolutePath());
            if (!parentFile.exists()) {
                parentFile.mkdirs();
            }
            File file = new File(parentFile.getAbsoluteFile(),fileName);
            if (!file.exists() ) {
                file.createNewFile(); // 创建文件filename,只创建文件，不创建文件夹
            }
            FileWriter fileWriter = new FileWriter(file.getAbsoluteFile(), isAppend);
            BufferedWriter bw = new BufferedWriter(fileWriter);
            bw.write(content);
            bw.close();
            return true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 删除指定目录下的文件，这里用于缓存的删除
     *
     * @param filePath       要删除的文件地址
     * @param deleteThisPath 是否要删除当前文件
     */
    private void deleteFolderFile(String filePath, boolean deleteThisPath) {
        if (!"".equals(filePath)) {
            try {
                File file = new File(filePath);
                if (file.isDirectory()) {
                    File files[] = file.listFiles();
                    for (File file1 : files) {
                        deleteFolderFile(file1.getAbsolutePath(), true);
                    }
                }
                if (deleteThisPath) {
                    if (!file.isDirectory()) {
                        file.delete();
                    } else {
                        if (file.listFiles().length == 0) {
                            file.delete();
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 格式化单位
     *
     * @param size 字节大小
     * @return 返回对应数字带单位
     */
    private static String getFormatSize(double size) {

        double dataFeed = 1024.0;

        double kiloByte = size / dataFeed;
        if (kiloByte < 1) { // 小于 1KB 返回 byte
            return size + "Byte";
        }

        double megaByte = kiloByte / dataFeed;
        if (megaByte < 1) { // 小于 1MB 返回 KB
            BigDecimal kbBigDecimal = new BigDecimal(Double.toString(kiloByte));
            return kbBigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "KB";
        }

        double gigaByte = megaByte / dataFeed;
        if (gigaByte < 1) { // 小于 1GB 返回 MB
            BigDecimal mbBigDecimal = new BigDecimal(Double.toString(megaByte));
            return mbBigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "MB";
        }

        double teraBytes = gigaByte / dataFeed;
        if (teraBytes < 1) { // 小于 1TB 返回 GB
            BigDecimal gbBigDecimal = new BigDecimal(Double.toString(gigaByte));
            return gbBigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "GB";
        }

        // 否则大于 1TB 显示 计算后的 TB
        BigDecimal tbBigDecimal = new BigDecimal(teraBytes);
        return tbBigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB";
    }

    /**
     * 获取文件夹下文件列表
     *
     * @param folderPath 文件夹的路径
     * @return 文件或文件夹的File列表集合
     */
    public static File[] getFolderFileList(String folderPath) {
        if (folderPath.isEmpty()) {
            return null;
        }
        File file = new File(folderPath);
        if (!file.exists() || file.isFile()) {
            return null;
        }
        String[] fileNamelist = file.list();
        File[] fileList = new File[fileNamelist.length];
        for (int i = 0; i < fileNamelist.length; i++) {
            fileList[i] = new File(folderPath + File.separator + fileNamelist[i]);
        }
        return fileList;
    }

    /**
     * bitmap保存到指定路径
     *
     * @param file 图片的绝对路径
     * @param file 位图
     * @return bitmap
     */
    public static boolean saveFile(String file, Bitmap bmp) {
        if (TextUtils.isEmpty(file) || bmp == null) return false;

        File f = new File(file);
        if (f.exists()) {
            f.delete();
        } else {
            File p = f.getParentFile();
            if (!p.exists()) {
                p.mkdirs();
            }
        }
        try {
            FileOutputStream out = new FileOutputStream(f);
            bmp.compress(Bitmap.CompressFormat.JPEG, 100, out);
            out.flush();
            out.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
        return true;
    }

    public static void main(String[] args) {
        for (File file : getFolderFileList("D:\\Snipaste\\lang")) {
            System.out.println(file.getPath());
        }
    }

}
